#include "gtktextbufferprivate.h"
#include "gtktexttag.h"
#include "gtktexttagprivate.h"
-#include "gtktexttagtable.h"
+#include "gtktexttagtableprivate.h"
#include "gtktextlayoutprivate.h"
#include "gtktextiterprivate.h"
#include "gtkdebug.h"
line = _gtk_text_iter_get_text_line (iter);
tree = _gtk_text_iter_get_btree (iter);
+
+ /* Short-circuit if we've never seen a visibility tag within the
+ * tag table (meaning everything must be visible).
+ */
+ if G_LIKELY (!_gtk_text_tag_table_affects_visibility (tree->table))
+ return FALSE;
+
byte_index = gtk_text_iter_get_line_index (iter);
numTags = gtk_text_tag_table_get_size (tree->table);
GSList *buffers;
gint anon_count;
+
+ guint seen_invisible : 1;
};
enum {
table->priv->hash = g_hash_table_new (g_str_hash, g_str_equal);
}
+static void
+check_visible (GtkTextTagTable *table,
+ GtkTextTag *tag)
+{
+ if (table->priv->seen_invisible)
+ return;
+
+ if (tag->priv->invisible_set)
+ {
+ gboolean invisible;
+
+ g_object_get (tag, "invisible", &invisible, NULL);
+ table->priv->seen_invisible = invisible;
+ }
+}
+
/**
* gtk_text_tag_table_new:
*
g_assert (size > 0);
tag->priv->priority = size - 1;
+ check_visible (table, tag);
+
g_signal_emit (table, signals[TAG_ADDED], 0, tag);
return TRUE;
}
GtkTextTag *tag,
gboolean size_changed)
{
+ check_visible (table, tag);
g_signal_emit (table, signals[TAG_CHANGED], 0, tag, size_changed);
}
+
+gboolean
+_gtk_text_tag_table_affects_visibility (GtkTextTagTable *table)
+{
+ return table->priv->seen_invisible;
+}
G_BEGIN_DECLS
-void _gtk_text_tag_table_add_buffer (GtkTextTagTable *table,
- gpointer buffer);
-void _gtk_text_tag_table_remove_buffer (GtkTextTagTable *table,
- gpointer buffer);
-void _gtk_text_tag_table_tag_changed (GtkTextTagTable *table,
- GtkTextTag *tag,
- gboolean size_changed);
+void _gtk_text_tag_table_add_buffer (GtkTextTagTable *table,
+ gpointer buffer);
+void _gtk_text_tag_table_remove_buffer (GtkTextTagTable *table,
+ gpointer buffer);
+void _gtk_text_tag_table_tag_changed (GtkTextTagTable *table,
+ GtkTextTag *tag,
+ gboolean size_changed);
+gboolean _gtk_text_tag_table_affects_visibility (GtkTextTagTable *table);
G_END_DECLS